#include<t_stdio.h>
 #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#define MSG_TYPE	0
#define MSG_TYPE_A	10
#define MSG_TYPE_B	11//自定义消息类型


int main(int argc,char * argv[]){
    //定义自己的消息数据结构体
    struct  msgmbuf
    {
        long mtype;
        char mtext[100];
        int pid;
    };
    
    //创建key值
    key_t key= ftok(".",1);
    if(key==-1)E_MSG("ftok",-1);

      //创建消息队列, 如果内核不存在队列就创建
    int msg= msgget(key,IPC_CREAT|0666);
    if(msg==-1)E_MSG("msgget",-1);
        
    //定义一个消息变量用来接收消息
      struct msgmbuf m_msg;
     //定义一个整数用来获取监听信息的字节数
     int retval; 

     //开始监听
     while(1){

        retval= msgrcv(msg,&m_msg,sizeof(m_msg),MSG_TYPE, IPC_NOWAIT);//IPC_NOWAIT，不等待，即不阻塞
      if((retval == -1))
		{
		if (errno == ENOMSG) { // 没有消息
                continue; // 跳过本次循环，继续监听
            } else {
                perror("msgrcv error");
                return -1;
		}
        }
        else if(retval>0)
        {
            printf("[PID:%d], msg type:%ld, msg:%s\n",m_msg.pid,m_msg.mtype,m_msg.mtext);
            if(strncmp(m_msg.mtext, "exit", 4) == 0)//可以指定长度为4时strlen(msg.mtext)才进行比较，仅仅对exit生效
			{
				break;
			}
        }
     } 
    //删除消息队列
    msgctl(msg,IPC_RMID, NULL);
    return 0;
}